import axios from 'axios';
import store from '@/store'
import { Dialog } from 'vant';

// 抛出 http 异常
const HttpError = (message) => {
  const error = new Error(message);
  error.name = 'HttpError';
  return Promise.reject(message);
};

// 创建axios实例
const service = axios.create({
  baseURL: window.LOCAL_CONFIG.API_HOME,//process.env.BASE_URL,
  timeout: 30*1000 //5 * 60 * 1000, // 请求超时时间
})

// request拦截器
service.interceptors.request.use(
  (config) => {
    // 请求头传token
    let token = localStorage.getItem('cloudToken') || '' //携带权限参数
    config.headers.token = token || ''
    return config;
  },
  (error) => {
    Promise.reject(error);
  }
);

// response 拦截器
service.interceptors.response.use(
  (response) => {
    // 如果请求的返回类型是流，则直接返回 data
    if (response.config.responseType === 'blob') {
      return response
    }
    if (response.config.responseType === 'arraybuffer') {
      return response
    }

    let resDataObj = response.data
    let { resultCode, resultMsg } = resDataObj
    // console.log('resDataObj', resDataObj)
    if (resultCode === 0) {
      return response
    } else {
      Dialog.alert({
        message: resultMsg,
      })
      return HttpError(resDataObj)
    }
  },
  (error) => {
    console.log('error-接口返回', error)
    if (error.message.includes('timeout')) {
      Dialog.alert({
        message: '网络超时',
      })
      return HttpError('网络超时')
    }
    if (error.response) {
      Dialog.alert({
        message: error?.response?.data?.resultMsg || error.response.statusText,
      })
      return HttpError(`请求异常：${error.response.statusText}`)
    }
    if (error.request) {
      return HttpError('请求异常：无返回结果');
    }
    return HttpError(error.message);
  }
);

/**
 * @param { url } 接口地址
 * @param { method } 请求方式
 * @param { data } 请求参数
 * @param { header } 请求头/token/cookie
 * @param { hideLoading }  不显示加载动画，默认显示加载动画
 * @param { hideToast }  不显示报错弹窗
 * @dataType 解析为JSON
 *
 */
const request = (options) => {
	let hideLoading = options.hideLoading || false
	return new Promise((resolve, reject) => {
    if (!hideLoading) {
      store.commit('openLoading')
    }
		service(options).then((res) => {
			if (!hideLoading) {
				store.commit('closeLoading')
			}
      resolve(res.data)
		}).catch(res => {
			if (!hideLoading) {
				store.commit('closeLoading')
			}
      reject(res)
		})
	})
};
export { service, request };
